package proyectoia;

import aima.search.framework.HeuristicFunction;

/**
 * Aquesta funció te en compte que el temps total de transmissio sigui menor i
 * que el temps de cada servidor sigui el més similar possible Per calcular que
 * el temps es el més similar possible fa servir la desviacio estandard el
 * paràmetre similarity serveix per determinar que te més mes importancia, el
 * temps total o la diferencia de temps entre servidors
 */
public class DistFileSystemHeuristicFunction2 implements HeuristicFunction {

    public float similarity;

    public DistFileSystemHeuristicFunction2() {
        this.similarity = 1;
    }

    public DistFileSystemHeuristicFunction2(float similarity) {
        this.similarity = similarity;
    }

    @Override
    public double getHeuristicValue(Object s) {
        DistFileSystemState state = (DistFileSystemState) s;
        int n = state.numServers;
        double total = state.getTotalServerTime();
        double mean = total / n;
        double variance = 0;
        for (int i = 0; i < n; i++) {
            variance += (mean - state.getServerTime(i)) * (mean - state.getServerTime(i));
        }
        variance /= n - 1;
        double stdev = Math.sqrt(variance);
        return mean + similarity * stdev;
    }
}
